package Git2024_5_27;

public class Redis1_2 {
    /**
     Redis回顾
     *  关于Redis，它是一个基于内存的键值对的非关系型数据库，设计为解决高并发场景下的数据存储问题
     * 特点:
     *  1. 开源：提供源代码，社区活跃，持续更新。
     *  2. 基于内存：数据存储在内存中，提供极快的读写速度。
     *  3. 自动支持数据持久化：通过RDB或AOF等方式保证数据在断电后不会丢失。
     *  4. 高性能的键值对数据库：适用于需要高速读写操作的场景。
     *  5. 一般与SQL型数据库配合使用：作为缓存层，减轻传统数据库的压力。
     * 类型使用场景:
     *  字符串(Strings)：做缓存、计数、存储验证码（常配合过期键EXPIRE使用）。
     *  列表(Lists)：实现任务队列，遵循先进先出(FIFO)原则。
     *  散列(Hashes)：存储对象类型数据，适合多维度的数据统计。
     *  集合(Sets)：用于增量爬虫、表示共同关注或共同好友等不重复元素集合。
     *  有序集合(Sorted Sets)：构建排行榜，成员带有分数，可按分数排序。
     * 常用全局命令:
     * 1. 数据操作：
     *    - EXISTS key：检查给定的键是否存在。
     *    - DEL key1 key2...：删除一个或多个键。
     *    - TYPE key：返回键的数据类型（string、list、set、zset、hash）。
     *    - KEYS pattern：查找匹配给定模式的所有键。
     *    - RANDOMKEY：随机返回数据库中的一个键。
     *    - RENAME key newkey：重命名键。
     *    - EXPIRE key seconds：为键设置过期时间（以秒为单位）。
     *    - PTTL key：返回键的剩余生存时间（以毫秒为单位）。
     *
     * 2. 数据类型转换：
     *    - STRLEN key：返回字符串键的长度。
     *    - HLEN key：返回哈希表中字段的数量。
     *    - LLEN key：返回列表的长度。
     *    - SCARD set：返回集合中元素的数量。
     *    - ZCARD zset：返回有序集合中元素的数量。
     *
     * 3. 键的管理：
     *    - DBSIZE：返回当前数据库中键的数量。
     *    - FLUSHDB：清除当前数据库中的所有键。
     *    - FLUSHALL：清除所有数据库中的所有键。
     *
     * 4. 事务控制：
     *    - WATCH key1 key2...：监视一个或多个键，如果在事务执行前这些键被修改，则事务失败。
     *    - UNWATCH：取消所有监视的键。
     *    - MULTI：开始一个事务。
     *    - EXEC：提交事务，执行所有事务块中的命令。
     *    - DISCARD：取消事务，放弃所有事务块中的命令。
     *
     * 5. 发布订阅：
     *    - SUBSCRIBE channel [channel...]：订阅一个或多个频道。
     *    - UNSUBSCRIBE [channel [channel...]]：退订一个或所有频道。
     *    - PUBLISH channel message：向指定频道发布消息。
     *
     * 6. 服务器信息与控制：
     *    - INFO [section]：返回关于Redis服务器的各种信息和统计。
     *    - COMMAND：列出Redis支持的所有命令及信息。
     *    - REBOOT：重启服务器（慎用，可能造成服务中断）。
     *
     * 7. 客户端管理：
     *    - CLIENT KILL ip:port：断开指定客户端连接。
     *    - CLIENT LIST：列出所有客户端连接信息。
     *
     * 8. 分布式协调：
     *    - PING：发送一个Ping命令，用于测试服务器是否在线。
     *    - TIME：返回服务器的当前时间（以毫秒为单位）。
     *
     * 请注意，以上命令只是Redis众多命令中的一部分，实际使用中应根据具体需求查阅完整的Redis命令文档。
     *  字符串常用命令:
     *     - SET key value：设置key-value。
     *     - GET key：获取value。
     *     - INCR key：数值+1（整数操作）。
     *     - DECR key：数值-1（整数操作）。
     *     - INCRBYFLOAT key increment：浮点型操作，增加指定浮点数。
     *  列表常用命令:
     *     - LPUSH key value：头部压入元素。
     *     - RPUSH key value：尾部压入元素。
     *     - LPOP key：从头部移除并返回元素。
     *     - RPOP key：从尾部移除并返回元素。
     */

    /**
     * \..
     哈希散列类型(Hash)
     *  问题: 字符串形式存储信息时 需要根据数据的更新创建许多不同的key来存储对应新增的value 包含多种附加信息 内存消耗极大
     *  措施: 引入Hash散列

     *  定义: 由field和关联的value组成的键值对
     *  特点: field和value是字符串类型
     *  缺点: 对于Hash散列来说 设置过期键时 只能设置指定的key的过期时间 无法对某个key中的某个field-value对进行设置
     *  存储方式: key: 每个对象只存储一个与之对应的key
     *          field: key散列中与value对应的信息对
     *          value: 存储多个该用户field-value数据与一个key对应
     *  存储原理: key保存的是内部数据(field-value对)的映射对应关系
     *  格式: key:{"field1":value1,"field2":value2,"field3":value3} --- key field value

     * 常用命令(H - Hash):
     *  1.设置1个key的field value: HSET key field value
     *    设置多个key的field value: HMSET key field1 value1 field2 value2 field3 value3 ...
     *  2.获取1个key的value: HGET key field
     *    获取多个key的value: HMGET key field1 field2 field3 ...
     *  - 规律: M 表示 many -
     *  3.获取1个key的所有value: HVALS key
     *    获取指定key的所有field value: HGETALL key
     *  4.获取字段或field的数量: HLEN key
     *  5.删除指定key的指定field: HDEL key field
     *  6.整数操作: HINCRBY key field num
     *    浮点型操作: HINCRBYFLOAT key field num

     * 应用场景: 如购物车功能 - 商品详情 - 数量 - 金额... - 内存中永久存储 - 一个对象,多个属性

     集合
     * 特点: 1.无序 自动去重
     *      2.成员[元素]是字符串类型
     *      3.最多包含2^23-1个成员

     * 常用命令(S - Set):
     *  1.添加1个或多个成员: SADD key member
     *      应用场景: 增量爬虫 - 利用URL地址唯一特点在爬取前到存储已爬取URL地址的集合中进行校验
     *                        返回值为1则为新增内容,为0则为已爬取内容 - 内存操作,速度快,效率高
     *  2.查看成员: SMEMBER key
     *  3.删除某集合的1个或多个成员: SREM key member1 member2...
     *  4.随机返回number个成员: SRANDMEMBER key number
     *  5.将1个随机成员弹出集合: SPOP key
     *    将number个随即成员弹出集合: SPOP key number
     *  6.差集: SDIFF key1 key2 - 取出的是key1中有 key2中没有的成员
     *         求key1和key2的差集并存储进key3中: SDIFFSTORE key3 key1 key2
     *  7.交集: SINTER
     *         求key1和key2的交集并存储进key3中: SINTERSTORE key3 key1 key2
     *      应用场景: 共同关注,共同好友 - 利用SCARD key可查看共同关注,共同好友数量
     *  8.并集: SUNION key1 key2
     *         求key1和key2的并集并存储进key3中: SUNIONSTORE key3 key1 key2
     *  9.获取集合中成员数量: SCARD key

     有序集合(Z)
     * 特点: 1.有序[指的是升序和降序而非按序号排列,默认升序排列] 自动去重
     *      2.元素是字符串类型
     *      3.每个元素关联着一个浮点数分值(score) 并按照分值从小到大或从大到小排列集合中的元素
     *      4.最多包含2^23-1个成员

     * 常用命令:
     *  1.无序添加1个或多个成员: ZADD key 分值1 member1 分值2 member2...
     *  2.升序查看成员: ZRANGE key startNumber(从0开始) stopNumber(-1表示最后一个成员)
     *    升序查看成员及分值: ZRANGE key startNumber(从0开始) stopNumber(-1表示最后一个成员) WITHSCORES
     *  3.降序查看成员及分值: ZREVRANGE key startNumber(从0开始) stopNumber(-1表示最后一个成员) WITHSCORES
     *    - REV - reverse: 倒序 反转 -
     *  4.增加或减少分值: ZINCRBY key 增加/减少的分值数 member
     *  5.获取成员的对应降序排名: ZREVRANK key member - 从0开始表示第一名
     *    获取成员的对应升序排名: ZRANK key member
     *  6.获取有序集合元素数量: ZCARD key
     *  7.交集: ZINTERSTORE 目标集合 取交集的集合数量(例如2) 集合1 集合2 WEIGHTS 集合1权重 集合2权重 AGGREGATE MAX|MIN|SUM
     *    - WEIGHTS: 权重 浮点数,能够设计不同集合在进行求交集操作时的影响力,例如1代表数值不变 0.5表示数值减半 2表示数值增倍等等 -
     *    - AGGREGATE: 指定如何合并相同成员的分数 有SUM(取和),MAX(取最大值),MIN(取最小值)三个选项 -

     * 应用场景: 排行榜
     */
}
